home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / falcon / rle.lzh / R_L_E.S < prev    next >
Encoding:
Text File  |  1995-10-27  |  15.3 KB  |  367 lines

  1. ; ----------------------------------------------------------------------------
  2. ; - Bernd Hübenett (RxT) 27.06.1995 Obertshausen                             -
  3. ; - Email (internet): huebenet@stud.uni-frankfurt.de                         -
  4. ; -                                                                          -
  5. ; - 27.06.1995 spät Abends                                                   -
  6. ; - Die Umsetzung des Lauflängenkodierers begonnen                           -
  7. ; - 28.06.1995 8:30                                                          -
  8. ; - Suzy hat eben angerufen.                                                 -
  9. ; - Ein schöner Weckdienst.                                                  -
  10. ; - 29.06.1995 7:10                                                          -
  11. ; - Scheint zu funktionieren, auch die Bugs  ;-)                             -
  12. ; - angeblich wurde Time.R16 auf 75 KByte komprimiert. Original 128 Kbyte.   -
  13. ; - Irgendwas stimmte doch noch nicht. Die Routinen so verändert das sie     -
  14. ; - jetzt nicht meht Bytes sondern Words komprimieren. Es funktioniert jetzt -
  15. ; - alles und Time.R16 ist jetzt nur noch ca. 71 Kbyte groß.                 -
  16. ; - Speicherroutinen integriert. Aus *.R16 wird ein *.C16                    -
  17. ; - Das R steht für Raw und das C für Compressed. 16 ist die Farbtiefe       -
  18. ; ----------------------------------------------------------------------------
  19.  
  20. cnecin          EQU 8
  21. logbase         EQU 3
  22. super           EQU 32
  23. vsync           EQU 37
  24.  
  25. start:          DC.W $A00A
  26.  
  27.                 pea     0
  28.                 move.w  #super,-(SP)
  29.                 trap    #1
  30.                 addq.l  #6,SP
  31.                 move.l  D0,ssp
  32.  
  33.                 move.w  #2,-(SP)        ; Bildschirmadressen holen
  34.                 trap    #14
  35.                 addq.l  #2,SP
  36.                 move.l  D0,oldphys      ; Bildschirmadresse in oldphys speichern
  37.                 move.w  #3,-(SP)
  38.                 trap    #14
  39.                 addq.l  #2,SP
  40.                 move.l  D0,oldlog
  41.  
  42.                 move.l  #screen+256,D0  ; Neue Video Adresse
  43.                 and.l   #$FFFFFF00,D0
  44.                 move.l  D0,buffscr
  45.  
  46.                 move.b  D0,$FFFF820D
  47.                 lsr.l   #8,D0
  48.                 move.b  D0,$FFFF8203
  49.                 lsr.l   #8,D0
  50.                 move.b  D0,$FFFF8201
  51.  
  52.                 bsr     Save_System
  53.  
  54.                 lea     Videl_320_200_True,A0
  55.                 bsr     Set_Res
  56.  
  57. ; Erst mal schauen welche Words wie oft vor kommen
  58. compress:       lea     bild,A0
  59.                 lea     anzahl_tab,A1
  60.                 clr.l   D1
  61.                 move.l  #64000,D0
  62. anzahl_loop:    move.w  (A0)+,D1
  63.                 DC.W $5271,$1A00 ; add.w #1,0(a1,d1.l*2)
  64.                 subq.l  #1,D0
  65.                 bne.s   anzahl_loop
  66.  
  67.                 lea     anzahl_tab,A0
  68.                 clr.l   D2              ; Pointer
  69.                 move.w  #0,D0           ; Scleifenzähler
  70.                 move.w  #65535,D1       ; mit maximal Wert initialisieren
  71. anzahl_loop_2:  move.w  (A0)+,D3        ; Wert holen
  72.                 cmp.w   D1,D3           ; und vergleichen
  73.                 bhi.s   zu_groß         ; wenn D3 größer dann verzweige
  74.                 move.w  D3,D1           ; neuer Wert nach D1
  75.                 move.w  D0,D2           ; Position festhalten
  76. zu_groß:        add.w   #1,D0
  77.                 cmp.w   #65535,D0
  78.                 bne.s   anzahl_loop_2
  79.  
  80. ; in D2 steht jetzt unser Escape-Word
  81. ; es hat die Eigenschaft das es wenigsten oder sogar gar nicht
  82. ; in den zu komprimierenden Daten vorkommt.
  83.  
  84. ; Kennungen:
  85. ; Daten (bei weniger als 4mal dem selben Zeichen)
  86. ; Escape-Word,Datum,Anzahl (bei mehr als 3mal dem selben Zeichen)
  87. ; Escape-Word,Escape-Word (Endkennung)
  88. ; Aufbau von coded_data:
  89. ; 1 Word = Das Escape-Word
  90.  
  91.  
  92.                 lea     bild,A0
  93.                 lea     coded_data,A1
  94.                 move.w  D2,(A1)+        ; Escape-Byte
  95.                 moveq   #0,D5
  96. rle_loop:       move.w  (A0),D3
  97.                 move.w  D3,D4
  98.                 swap    D3
  99.                 move.w  D4,D3
  100.                 cmp.l   0(A0),D3
  101.                 bne.s   no_kompress
  102.                 cmp.l   4(A0),D3        ; 4mal der selbe Wert ??
  103.                 bne.s   no_kompress
  104. komprimieren:   move.w  #4,D4           ; Schleifenzähler
  105.                 addq.l  #4,D5
  106.                 adda.l  #8,A0
  107. komp_loop:      cmp.w   (A0)+,D3
  108.                 bne.s   not_equal
  109.  
  110.                 addq.l  #1,D5
  111.                 cmp.l   #64000,D5
  112.                 bhi.s   not_equal
  113.  
  114.                 addq.w  #1,D4
  115.                 cmp.w   #65535,D4       ; nicht mehr als 65535
  116.                 bne.s   komp_loop
  117. not_equal:      move.w  D2,(A1)+        ; Escape
  118.                 move.w  D3,(A1)+        ; Datum
  119.                 move.w  D4,(A1)+        ; Anzahl
  120.                 bra.s   check_loop
  121. no_kompress:    move.w  D3,(A1)+        ; Datum
  122.                 addq.l  #1,D5
  123.                 addq.l  #2,A0
  124. check_loop:     cmp.l   #64000,D5
  125.                 bls.s   rle_loop
  126.                 move.w  D2,(A1)+        ; Endkennung
  127.                 move.w  D2,(A1)+        ; Endkennung
  128.  
  129.                 lea     coded_data,A0   ; Länge der
  130.                 suba.l  A0,A1           ; komprimierten Daten ermitteln
  131.  
  132.                 move.w  #0,-(SP)
  133.                 pea     filename
  134.                 move.w  #$3C,-(SP)      ; Fcreate
  135.                 trap    #1
  136.                 addq.l  #8,SP
  137.                 move.w  D0,handle
  138.  
  139.                 pea     coded_data
  140.                 move.l  A1,-(SP)
  141.                 move.w  handle,-(SP)
  142.                 move.w  #$40,-(SP)
  143.                 trap    #1
  144.                 lea     $0C(SP),SP
  145.  
  146.                 move.w  handle,-(SP)
  147.                 move.w  #$3E,-(SP)
  148.                 trap    #1
  149.                 addq.l  #4,SP
  150.  
  151. ; Der Dekomprimierer
  152.                 lea     coded_data,A0
  153.                 movea.l buffscr,A1
  154.                 move.w  (A0)+,D0        ; Escape-Byte
  155. dek_loop:       move.w  (A0)+,D1        ; Coded_data -> D1.W
  156.                 cmp.w   D1,D0           ; Ist es ein Escape-Word
  157.                 bne.s   nicht_komp      ; springe wenn normales Datum
  158.                 move.w  (A0)+,D2        ; nächstes Word nach D2.W
  159.                 cmp.w   D0,D2           ; wenn Escape-Word
  160.                 beq.s   dek_ende        ; dann dekompression beenden
  161.                 move.w  (A0)+,D3        ; Anzahl der Daten
  162. dek_fill:       move.w  D2,(A1)+        ; in D2 steht das Datum
  163.                 dbra    D3,dek_fill
  164.                 bra.s   dek_loop
  165. nicht_komp:     move.w  D1,(A1)+
  166.                 bra.s   dek_loop
  167. dek_ende:
  168.  
  169.                 move.w  #8,-(SP)
  170.                 trap    #1
  171.                 addq.l  #2,SP
  172.  
  173. raus:           bsr     restore_system
  174.                 bsr     wait_vsync
  175.                 move.l  oldlog,D0
  176.                 move.b  D0,$FFFF820D
  177.                 lsr.l   #8,D0
  178.                 move.b  D0,$FFFF8203
  179.                 lsr.l   #8,D0
  180.                 move.b  D0,$FFFF8201
  181.  
  182.                 move.l  ssp,-(SP)
  183.                 move.w  #super,-(SP)
  184.                 trap    #1
  185.                 addq.l  #6,SP
  186.  
  187.                 clr.w   -(SP)
  188.                 trap    #1
  189.  
  190. ; ------------------------------------------
  191. ; ----- A U F   V S Y N C   W A R T E N ----
  192. ; ------------------------------------------
  193.  
  194. wait_vsync:     move.l  D0,-(SP)
  195.                 move.l  $0462,D0
  196. wait_wait_x:    cmp.l   $0462,D0
  197.                 beq.s   wait_wait_x
  198.                 move.l  (SP)+,D0
  199.                 rts
  200.  
  201. ; ---------------------------------------------
  202. ; -------- S E T  V I D E O  M O D E ----------
  203. ; ---------------------------------------------
  204. ; Parameter:
  205. ;             A0.L : Adresse der Betriebsart
  206. ;                      (aus der Tabelle)
  207. ; ---------------------------------------------
  208.  
  209. Set_Res:        move.b  #2,$FFFF820A.w  ; Horloge Interne
  210.                 clr.b   $FFFF8265.w     ; Décalage Pixel Nul
  211.                 addq.l  #4,A0
  212.                 move.w  (A0)+,$FFFF820E.w ; Offset bis zur nächsten Zeile (Words)
  213.                 move.w  (A0)+,$FFFF8210.w ; Länge der sichtbaren Zeile (Words)
  214.                 move.w  (A0)+,D0        ; Résolution ST
  215.                 move.w  (A0)+,D1        ; Résolution FALCON
  216.  
  217.                 move.w  D1,$FFFF8266.w  ; Résolution FALCON
  218.                 tst.w   (A0)+
  219.                 beq.s   FalconRez
  220.                 move.b  D0,$FFFF8260.w  ; Résolution ST
  221.                 move.w  -8(A0),$FFFF8210.w ; Largeur d'une ligne en mots
  222. FalconRez:
  223. ;                btst    #7,$FFFF8006.w  ; Ecran VGA ?
  224. ;                beq.s   R_Ok            ; Si non,saut...
  225. ;                adda.w  #16*2,A0
  226. R_Ok:           move.w  (A0)+,$FFFF8282.w ; HHT-Synchro
  227.                 move.w  (A0)+,$FFFF8284.w ; Fin du décodage de la ligne
  228.                 move.w  (A0)+,$FFFF8286.w ; Début du décodage de la ligne
  229.                 move.w  (A0)+,$FFFF8288.w ; Overscan links
  230.                 move.w  (A0)+,$FFFF828A.w ; Overscan rechts
  231.                 move.w  (A0)+,$FFFF828C.w ; HSS-Synchro
  232.                 move.w  (A0)+,$FFFF828E.w ; HFS
  233.                 move.w  (A0)+,$FFFF8290.w ; HEE
  234.                 move.w  (A0)+,$FFFF82A2.w ; VFT-Synchro
  235.                 move.w  (A0)+,$FFFF82A4.w ; Fin du décodage de l'image
  236.                 move.w  (A0)+,$FFFF82A6.w ; Début du décodage de l'image
  237.                 move.w  (A0)+,$FFFF82A8.w ; Overscan oben
  238.                 move.w  (A0)+,$FFFF82AA.w ; Overscan unten
  239.                 move.w  (A0)+,$FFFF82AC.w ; VSS-Synchro
  240.                 move.w  (A0)+,$FFFF82C0.w ; Indique résolution FALCON
  241.                 move.w  (A0),$FFFF82C2.w ; Informations résolution
  242.                 rts
  243.  
  244. ; ---------------------------------------------
  245. ; ----------  V I D E O  S A V E --------------
  246. ; ---------------------------------------------
  247.  
  248. Save_System:    lea     Old_System,A0
  249.                 move.b  $FFFF8007.w,(A0)+ ; Configuration 68030
  250.                 move.b  $FFFF820A.w,(A0)+ ; Synchronisation vidéo
  251.                 move.w  $FFFF820E.w,(A0)+ ; Offset pour prochaine ligne
  252.                 move.w  $FFFF8210.w,(A0)+ ; Largeur d'une ligne en mots
  253.                 move.b  $FFFF8260.w,(A0)+ ; Résolution ST
  254.                 move.b  $FFFF8265.w,(A0)+ ; Décalage Pixel
  255.                 move.w  $FFFF8266.w,(A0)+ ; Résolution FALCON
  256.                 move.w  $FFFF8282.w,(A0)+ ; HHT-Synchro
  257.                 move.w  $FFFF8284.w,(A0)+ ; Fin du décodage de la ligne
  258.                 move.w  $FFFF8286.w,(A0)+ ; Début du décodage de la ligne
  259.                 move.w  $FFFF8288.w,(A0)+ ; Overscan gauche
  260.                 move.w  $FFFF828A.w,(A0)+ ; Overscan droit
  261.                 move.w  $FFFF828C.w,(A0)+ ; HSS-Synchro
  262.                 move.w  $FFFF828E.w,(A0)+ ; HFS
  263.                 move.w  $FFFF8290.w,(A0)+ ; HEE
  264.                 move.w  $FFFF82A2.w,(A0)+ ; VFT-Synchro
  265.                 move.w  $FFFF82A4.w,(A0)+ ; Fin du décodage de l'image
  266.                 move.w  $FFFF82A6.w,(A0)+ ; Début du décodage de l'image
  267.                 move.w  $FFFF82A8.w,(A0)+ ; Overscan haut
  268.                 move.w  $FFFF82AA.w,(A0)+ ; Overscan bas
  269.                 move.w  $FFFF82AC.w,(A0)+ ; VSS-Synchro
  270.                 move.w  $FFFF82C0.w,(A0)+ ; Reconnaissance ST/FALCON
  271.                 move.w  $FFFF82C2.w,(A0)+ ; Informations résolution
  272.  
  273.                 lea     $FFFF8240.w,A1  ; Palette ST
  274.                 moveq   #8-1,D0         ; 8 longs...
  275. Save_ST_Palette:
  276.                 move.l  (A1)+,(A0)+     ; Sauve 2 couleurs
  277.                 dbra    D0,Save_ST_Palette ; Boucle les 16 mots !
  278.  
  279.                 lea     $FFFF9800.w,A1  ; Palette FALCON
  280.                 move.w  #256-1,D0       ; 256 longs...
  281. Save_FALCON_Palette:
  282.                 move.l  (A1)+,(A0)+     ; Sauve 1 couleur
  283.                 dbra    D0,Save_FALCON_Palette ; Boucle les 256 longs !
  284.                 rts
  285.  
  286. ; --------------------------------------------
  287. ; ------  V I D E O   R E S T O R E ----------
  288. ; --------------------------------------------
  289.  
  290. restore_system: move    #$2700,SR       ; Interrupts sperren
  291.                 lea     Old_System,A0   ; Espace de sauvegarde
  292.                 move.b  (A0)+,$FFFF8007.w ; Configuration 68030
  293.                 move.b  (A0)+,$FFFF820A.w ; Video-Syncronisation
  294.                 move.w  (A0)+,$FFFF820E.w ; Offset pour prochaine ligne
  295.                 move.w  (A0)+,$FFFF8210.w ; Largeur d'une ligne en mots
  296.                 move.b  (A0)+,D0        ; Résolution ST
  297.                 move.b  (A0)+,$FFFF8265.w ; Décalage Pixel
  298.                 move.w  (A0)+,D1        ; Résolution FALCON
  299.                 move.w  (A0)+,$FFFF8282.w ; HHT-Synchro
  300.                 move.w  (A0)+,$FFFF8284.w ; Fin du décodage de la ligne
  301.                 move.w  (A0)+,$FFFF8286.w ; Début du décodage de la ligne
  302.                 move.w  (A0)+,$FFFF8288.w ; Overscan gauche
  303.                 move.w  (A0)+,$FFFF828A.w ; Overscan droit
  304.                 move.w  (A0)+,$FFFF828C.w ; HSS-Synchro
  305.                 move.w  (A0)+,$FFFF828E.w ; HFS
  306.                 move.w  (A0)+,$FFFF8290.w ; HEE
  307.                 move.w  (A0)+,$FFFF82A2.w ; VFT-Synchro
  308.                 move.w  (A0)+,$FFFF82A4.w ; Fin du décodage de l'image
  309.                 move.w  (A0)+,$FFFF82A6.w ; Début du décodage de l'image
  310.                 move.w  (A0)+,$FFFF82A8.w ; Overscan haut
  311.                 move.w  (A0)+,$FFFF82AA.w ; Overscan bas
  312.                 move.w  (A0)+,$FFFF82AC.w ; VSS-Synchro
  313.                 move.w  (A0)+,$FFFF82C0.w ; Reconnaissance ST/FALCON
  314.                 move.w  (A0)+,$FFFF82C2.w ; Informations résolution
  315.                 move.w  D1,$FFFF8266.w  ; Fixe résolution FALCON...
  316.                 btst    #0,$FFFF82C0.w  ; Résolution FALCON ?
  317.                 bne.s   Falcon_Rez      ; Si oui,saut !
  318.                 move.b  D0,$FFFF8260.w  ; Fixe résolution ST...
  319. Falcon_Rez:     lea     $FFFF8240.w,A1  ; ST-Farbpalette restaurieren
  320.                 moveq   #7,D0           ; 8 Langwörter...
  321. Rest_ST_Palette:
  322.                 move.l  (A0)+,(A1)+     ; immer 2 Farben auf einmal
  323.                 dbra    D0,Rest_ST_Palette
  324.  
  325.                 lea     $FFFF9800.w,A1  ; FALCON-Farbpalette restaurieren
  326.                 move.w  #255,D0         ; 256 Langwörter
  327. Rest_FALCON_Palette:
  328.                 move.l  (A0)+,(A1)+     ; eine Farbe nach der anderen
  329.                 dbra    D0,Rest_FALCON_Palette
  330.                 move    #$2000,SR       ; Interrupts freigeben
  331.                 rts
  332.  
  333.                 DATA
  334. Videl_320_200_True:
  335.                 DC.L 320*200*16/8+256 * Général
  336.                 DC.W 0,320,0,$0100
  337.                 DC.W 0          * Flag Ordre
  338.  
  339.                 DC.W 254,203,39,46,143,216,0,0 * RVB
  340.                 DC.W 625,613,47,127,527,619
  341.                 DC.W $0181,%0
  342.  
  343.                 DC.W 198,150,15,682,139,150,0,0 * VGA 47 Hz
  344.                 DC.W 1337,1300,100,315,1115,1333
  345.                 DC.W $0186,%101
  346.                 EVEN
  347. filename:       DC.B 'Time.C16',0
  348.                 EVEN
  349. bild:           IBYTES 'TIME.R16'
  350.                 BSS
  351.                 EVEN
  352. anzahl_tab:     DS.W 65535
  353. coded_data:     DS.L 60000      ; 240 KByte reservieren
  354.                 EVEN
  355.                 DS.B 256
  356. ssp:            DS.L 1
  357. oldlog:         DS.L 1
  358. handle:         DS.L 1
  359. oldphys:        DS.L 1
  360. oldmode:        DS.L 1
  361. buffscr:        DS.L 1
  362. Old_System:     DS.L 500        ; Buffer für altes System
  363.                 EVEN
  364.                 DS.B 256
  365. screen:         DS.L 38400
  366.                 END
  367.